package ch03_gc;

/***
 * 在虚拟机栈（栈帧中的本地变量表）中引用的对象，譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。
 * ·在方法区中类静态属性引用的对象，譬如Java类的引用类型静态变量。
 * ·在方法区中常量引用的对象，譬如字符串常量池（String Table）里的引用。
 * ·在本地方法栈中JNI（即通常所说的Native方法）引用的对象。
 * ·Java虚拟机内部的引用，如基本数据类型对应的Class对象，一些常驻的异常对象（比如NullPointExcepiton、OutOfMemoryError）等，还有系统类加载器。
 * ·所有被同步锁（synchronized关键字）持有的对象。
 * ·反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。
 */
public class P1_ReferenceCountGC {
    public Object instance = null;
    private static final int _1MB = 1024 * 1024;
    /**
     * 这个成员属性的唯一意义就是占点内存，以便能在GC日志中看清楚是否有回收过
     */
    private byte[] bigSize = new byte[20 * _1MB];
    public static void main(String[] args) throws InterruptedException {
        P1_ReferenceCountGC objA = new P1_ReferenceCountGC();
        P1_ReferenceCountGC objB = new P1_ReferenceCountGC();
        objA.instance = objB;
        objB.instance = objA;
        objA = null;
        objB = null;
// 假设在这行发生GC，objA和objB是否能被回收？
        System.gc();
        Thread.sleep(2000);
    }
}
